﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using Microsoft.Phone.Controls;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Giao diện chính.
    /// \author Ngô Trọng Nghĩa -   0912305.
    /// \details <h3>Hiển thị giao diện chính và xử lý tương tác</h3>
    ////////////////////////////////////////////////
    public partial class MainPage : PhoneApplicationPage
    {
        private bool click;
        private bool search;
        private Image preImage;
        private int mode;
        private bool isfirst = true;
        private DispatcherTimer timerComplete;
        private readonly DispatcherTimer timer;
        private string prevInput;
        private readonly string resource = "/HCMUS_SearchService_Group2;component/Images/";
        public static DefaultSearchEngine searchEngine;
        private CorrectSpellingHelper correctSpelling;
        private AutoCompleteHelper autoComplete;
        public static List<ContentDataDTO> result;
        public static List<ServiceDetailDTO> detailMenu;
        public static string correctWords;

        /////////////////////////////////////////////////
        /// \brief Hàm khởi tạo.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Khởi tạo các biến.</h3>
        /////////////////////////////////////////////////
        public MainPage()
        {
            InitializeComponent();
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(100);
            timer.Tick += new EventHandler(timer_Tick);

            timer.Start();

            timerComplete = new DispatcherTimer();
            timerComplete.Interval = TimeSpan.FromMilliseconds(100);
            timerComplete.Tick += new EventHandler(timerComplete_Tick);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi chọn dịch vụ.
        /// \param[in] object
        /// \param[in] MouseButtonEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào hình ảnh dịch vụ.</h3>
        /////////////////////////////////////////////////
        private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            /// \see ProcessClick(object, MouseButtonEventArgs).
            this.ProcessClick(sender, e);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi chọn dịch vụ.
        /// \param[in] object
        /// \param[in] MouseButtonEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Các bước thực hiện:</h3>
        /////////////////////////////////////////////////
        private void ProcessClick(object sender, MouseButtonEventArgs e)
        {
            /// - Bước 1: Xác định dịch vụ được chọn.
            Image image = (Image)sender;
            if (!image.Name.Equals(this.preImage.Name))
            {
                this.click = true;
            }

            /// - Bước 2: Hủy dịch vụ được chọn trước đó.
            this.preImage.Source = new BitmapImage(new Uri(String.Format("{0}{1}[0].png", this.resource, this.preImage.Name), UriKind.RelativeOrAbsolute));

            /// - Bước 3: Xử lý hiển thị
            /// \see Image_Click(Image)
            this.Image_Click(image);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý hiển thị khi chọn dịch vụ.
        /// \param[in] Image image
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Các bước thực hiện: </h3> 
        /////////////////////////////////////////////////
        private void Image_Click(Image image)
        {
            /// - Bước 1: Thay đổi resource của hình ảnh hiển thị dịch vụ.
            string source = this.resource;
            if (!this.click)
            {
                source += image.Name + "[0].png";
            }
            else
            {
                source += image.Name + "[1].png";
            }

            image.Source = new BitmapImage(new Uri(source, UriKind.RelativeOrAbsolute));

            /// - Bước 2: Lưu lại tình trạng hiển thị hiện tại
            this.click = !this.click;
            this.preImage = image;
            this.mode = Convert.ToInt32(this.preImage.Tag);
            this.Complete.Visibility = System.Windows.Visibility.Collapsed;
            // Do something here
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhập nội dung.
        /// \param[in] object
        /// \param[in] MouseButtonEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details Bắt lệnh khi người dùng nhấn vào vùng nhập nội dung tìm kiếm.
        /////////////////////////////////////////////////
        private void Label_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            /// \see Label_Click()
            this.Label_Click();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhập nội dung.
        /// \param[in] Không
        /// \param[out] Không
        /// \return Không
        /// \details Xử khi người dùng nhấn vào vùng nhập nội dung tìm kiếm.
        /// \details <h3>Các bước thực hiện: </h3>
        /////////////////////////////////////////////////
        private void Label_Click()
        {
            /// - Bước 1: Ẩn Label, là một textblock có vai trò hint.
            this.Label.Visibility = System.Windows.Visibility.Collapsed;

            /// - Bước 2: Focus vào textbox để nhập nội dung.
            this.Txt_Search.Focus();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào icon có chức năng Delete. </h3>
        /////////////////////////////////////////////////
        private void DeleteApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see DeleteIcon_Click()
            this.DeleteIcon_Click();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhấn vào icon Delete trên ApplicationBar.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details Reset lại tình trạng hiển thị ban đầu của giao diện chính.
        /////////////////////////////////////////////////
        private void DeleteIcon_Click()
        {
            this.Label.Visibility = System.Windows.Visibility.Visible;
            this.preImage.Source = new BitmapImage(new Uri(String.Format("{0}{1}[0].png", this.resource, this.preImage.Name), UriKind.RelativeOrAbsolute));
            this.Txt_Search.Text = String.Empty;
            this.mode = 0;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào Search.
        /// \param[in] object
        /// \param[in] MouseButtonEventArgs
        /// \param[out] Không
        /// \return Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào image có chức năng Search.</h3>
        /////////////////////////////////////////////////
        private void Img_Search_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            /// \see Search_Click()
            this.Search_Click();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm xử lý khi nhấn vào image có chức năng Search.
        /// \param[in] Không
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Các bước thực hiện: </h3>
        /////////////////////////////////////////////////
        private void Search_Click()
        {
            /// - Bước 1: Lấy đối số cần thiết cho việc Search
            if (!this.search)
            {
                this.search = true;
                string str = String.Empty;
                if (Txt_Search.Text.Equals(String.Empty))
                {
                    MessageBox.Show("Please fill search text!");
                    this.search = false;
                }
                else
                {
                    str = this.Txt_Search.Text;
                    this.Complete.Visibility = System.Windows.Visibility.Collapsed;
                    /// - Bước 2: Gọi hàm có chức năng tìm kiếm.
                    if (result.Count > 0)
                        result.Clear();
                    result = searchEngine.Search(str, this.mode);
                    if (0 != result.Count)
                    {
                        /// - Bước 3: Chuyển hướng qua trang hiển thị danh sách kết quả.
                        NavigationService.Navigate(new Uri("/ListResultPage.xaml", UriKind.Relative));
                        timerComplete.Stop();
                    }
                    else
                    {
                        MessageBox.Show("Don't have result!");
                        this.search = false;
                    }

                }
            }
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt lệnh khi nhấn vào icon trên ApplicationBar.
        /// \param[in] object
        /// \param[in] EventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Bắt lệnh khi người dùng nhấn vào icon có chức năng Search. </h3>
        /////////////////////////////////////////////////
        private void SearchApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            /// \see Search_Click();
            this.Search_Click();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm bắt sự kiện chuyển trang.
        /// \param[in] NavigationEventArgs
        /// \param[out] Không
        /// \returns Không
        /// \details <h3>Cập nhật lại trạng thái search.</h3>
        /////////////////////////////////////////////////
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            //base.OnNavigatedTo(e);
            this.search = false;
            timerComplete.Start();
        }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            if (isfirst)
            {
                this.isfirst = false;
                this.preImage = new Image();
                this.mode = 0;
                this.click = false;
                Dispatcher.BeginInvoke(() =>
                {
                    SearchHelper.InitData();
                    this.correctSpelling = new CorrectSpellingHelper();
                });
                searchEngine = new DefaultSearchEngine();
                this.autoComplete = new AutoCompleteHelper();
                result = new List<ContentDataDTO>();
                detailMenu = new List<ServiceDetailDTO>();
                this.search = false;
                
            }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            this.progressBar.Value += 10;
            if (this.progressBar.Value >= this.progressBar.Maximum)
            {
                timer.Stop();
                timerComplete.Start();
                this.progressBar.Visibility = System.Windows.Visibility.Collapsed;
            }
        }
        List<String> sugests;
        private void timerComplete_Tick(object sender, EventArgs e)
        {
            if (this.prevInput == this.Txt_Search.Text)
                return;
            if (this.Txt_Search.Text.Length == 1)
                this.Complete.Visibility = System.Windows.Visibility.Visible;
            else if (this.Txt_Search.Text.Length > 1)
            {
                if (this.AutoComplete.Items.Count > 0)
                    this.AutoComplete.Items.Clear();
                sugests = autoComplete.GetSuggest(this.Txt_Search.Text);
                for (int i = 0; i < sugests.Count; i++)
                {
                    this.AutoComplete.Items.Add(sugests[i]);
                }
                prevInput = this.Txt_Search.Text;
            }
        }

        private void AutoComplete_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((ListBox)sender).SelectedItem != null)
            {
                this.Txt_Search.Text = ((ListBox)sender).SelectedItem.ToString();
                this.Search_Click();
            }
        }

        private void CheckApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            string str = String.Empty;
            if (!Txt_Search.Text.Equals(String.Empty))
            {
                str = this.Txt_Search.Text;
            }

            /// - Bước 1: Kiểm tra chính tả
            correctWords = this.correctSpelling.CorrectSpelling(str);
            if (null != correctWords)
            {
                /// - Bước 2: Hiện gợi ý.
                this.CheckSpelling.Text = correctWords;
                this.Spelling.Visibility = System.Windows.Visibility.Visible;
                this.Complete.Visibility = System.Windows.Visibility.Collapsed;
            }
            else
                MessageBox.Show("Don't find correct word");
        }


        private void CheckSpelling_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.Txt_Search.Text = ((TextBlock)sender).Text;
            this.Spelling.Visibility = System.Windows.Visibility.Collapsed;
        }
    }
}